module sw.utils;
import sw.siteconfig, nazo.http, std.uri, std.string;

///ページタイトルを取得します。
string getPageTitle(SiteConfig* cfg){
  string title;
  auto t="title" in Http.query;
  if(!cfg.usePathInfo&&!t)
    title=cfg.topPageName;
  else if(!cfg.usePathInfo)
    title=decodeComponent((*t).replace("+"," "));
  else{
    string path=Http.pathInfo;
    if(path.length)
      path=path[1..$];
    if(path.length)
      if(path[$-1]=='/')path=path[0..$-1];
    title=path;
  }
  if(!title.length)title=cfg.topPageName;
  return title;
}

///タイトルからファイル名に変換します。
///Bugs: 多段replaceは遅い
string titleToFileName(string title){
  return encode(title).replace("/","%2F").replace(".","%2E");
}

///タイトルをurlの引数からurlのパスにします。
string argToParam(string str){
  return encodeComponent(str).replace("%2F", "/");
}

///urlの引数をデコードします。
string uridecode(string str){
  return decodeComponent(str.replace("+", " "));
}

///タイトルからそのURIを作成します。
string genURI(SiteConfig* cfg, string title, string baseURI = Http.relPath){
  string rv;
  if(!cfg.usePathInfo)
    rv=baseURI~"?title="~encodeComponent(title);
  else
    rv=baseURI~"/"~argToParam(title);
  return rv;
}

///XHTMLエスケープされたURIのパラメータの最初のセパレータを返します。
string genURISep(SiteConfig* cfg){
  if(cfg.usePathInfo)
    return "?";
  return "&amp;";
}

///URIのパラメータの最初のセパレータを返します。
char genURISep2(SiteConfig* cfg){
  if(cfg.usePathInfo)
    return '?';
  return '&';
}

///オリジナルのuriを取得します。
string getOriginalUri(SiteConfig* cfg){
  assert(cfg.synchronizeURI!="");
  string req=Http.reqURI;
  return getSyncURI(cfg)~"index.cgi"~(req.length<=Http.getScriptName.length?"":req[Http.getScriptName.length..$]);
}

///syncuriを取得します。
string getSyncURI(SiteConfig* cfg){
  string syncURI=cfg.synchronizeURI;
  int i=syncURI.find("index.cgi");
  if(i>=0)
    syncURI=syncURI[0..i];
  if(!syncURI.length || syncURI[$-1]!='/')
    syncURI~="/";
  return syncURI;
}
